package com.damon.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Map.Entry;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.damon.log.WcsLog;

public class DbUtil {
	
//	Logger logger = LoggerFactory.getLogger(DbUnits.class);
	static WcsLog logger = LogUtil.getLogger(DbUtil.class);
	public static DataSource dataSource = null;
	public static Map<String,String> propertiesMap = new HashMap<>();
	
	private final static int RECONNECTION_TIME = 2;//数据库重连时间单位(秒)
	public static String propertiesName = null;
	
//	public static String loadPropFile() {
	 static  {
		String propName = "druid.properties";
		Properties properties = new Properties();
		InputStream is = null;
//		String propertiesName = null;
		try {
			//默认加载项目内路径
			is = PropertiesUtil.class.getResourceAsStream("/"+propName);
			propertiesName = "项目内路径-"+PropertiesUtil.class.getResource("/"+propName).getPath();
			
			/*
			 * 该种方式可以在使用bat文件时，正确找到jar，然后在同级目录找到配置文件。
			 * 但是把jar包做成exe文件后，无法正确找到，这时可是使用同级目录的方式找到配置文件。
			 */
			File jarFile = new File(System.getProperty("java.class.path"));
			File propFlieByJar = new File(jarFile.getParent()+"/config/"+propName);
			
			//直接读取程序同目录文件夹下的文件
			File propFlieByProgram = new File("config/"+propName);
			
			if(propFlieByJar.exists()) {
				//先找到该程序所在父级目录，在读取同包配置文件
				is = new FileInputStream(propFlieByJar);
				propertiesName = propFlieByJar.getAbsolutePath();
			}else if(propFlieByProgram.exists()) {
				//读取程序同包配置文件
				is = new FileInputStream(propFlieByProgram);
				propertiesName = propFlieByProgram.getAbsolutePath();
			}
			
			if(is!=null) {
				properties.load(is);
				//保存配置文件参数
				Set<Entry<Object, Object>> propertiesSet = properties.entrySet();
				propertiesSet.stream().forEach(e -> {
					propertiesMap.put((String) e.getKey(), (String) e.getValue());
				});
				// 返回的是DataSource，不是DruidDataSource
				dataSource = DruidDataSourceFactory.createDataSource(properties);
			}else {
				propertiesName = "无可加载文件！！";
			}
			logger.info("数据库加载路径："+propertiesName);
			
		} catch (IOException e) {
			logger.error("读取配置文件失败！",e);
			e.printStackTrace();
		} catch (Exception e) {
			logger.error("创建druid连接池失败！",e);
			e.printStackTrace();
		}finally {
			if(is !=null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
//		return propertiesName;
	}
	
	//druid连接池配置信息
//	static {
//		String propName = "druid.properties";
//		Properties properties = new Properties();
//		InputStream is = null;
//		try {
//			/*
//			 * 该种方式可以在使用bat文件时，正确找到jar，然后找到配置文件。
//			 * 但是把jar包做成exe文件后，无法正确找到，这时可是使用同级目录的方式找到配置文件。
//			 */
//			File jarFile = new File(System.getProperty("java.class.path"));
//			File propFlie = new File(jarFile.getParent()+"/config/"+propName);
//			
//			File propFlie2 = new File("config/"+propName);
////			logger.info(propFlie.getPath());
////			logger.info(propFlie2.getPath());
//			if(propFlie.exists()) {
//				//先找到该程序所在父级目录，在读取同包配置文件
//				is = new FileInputStream(propFlie);
//				logger.info("数据库配置文件加载路径："+propName);
//			}else if(propFlie2.exists()) {
//				//读取程序同包配置文件
//				is = new FileInputStream(propFlie2);
//				logger.info("数据库配置文件加载路径："+propName);
//			}
//			else {
//				//读取项目内resource路径
//				is = DbUtil.class.getResourceAsStream("/"+propName);
//				logger.info("数据库配置文件加载路径："+propName);
//			}
//			
//			properties.load(is);
//			//保存配置文件参数
//			Set<Entry<Object, Object>> propertiesSet = properties.entrySet();
//			propertiesSet.stream().forEach(e -> {
//				propertiesMap.put((String) e.getKey(), (String) e.getValue());
//			});
//			logger.info(DbUtil.propertiesMap.get("url"));
//		} catch (IOException e) {
//			logger.error("读取druid配置文件失败！",e);
//			e.printStackTrace();
//		}finally {
//			if(is != null) {
//				try {
//					is.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		
//		
//		// 返回的是DataSource，不是DruidDataSource
//		try {
//			dataSource = DruidDataSourceFactory.createDataSource(properties);
////			logger.info("数据库配置文件读取完毕！");
//		} catch (Exception e) {
//			logger.error("创建druid连接池失败！",e);
//			e.printStackTrace();
//		}
//	}
	
	public synchronized static Connection getConnection() {
		boolean isNoConnection = true;
		Connection connection = null;
		while(isNoConnection) {
			try {
				connection = dataSource.getConnection();
//				logger.info("数据库连接成功！");
				GlobalOjbectUtil.getWindow().getDbStatusLabel().setText("数据库连接成功！");
				isNoConnection = false;
			} catch (SQLException e) {
				logger.error("数据库连接失败",e);
				GlobalOjbectUtil.getWindow().getDbStatusLabel().setText("数据库连接失败！");
				logger.info(RECONNECTION_TIME+"秒后重新连接,请检查数据库配置并确认数据库已开启！");
				try {
					Thread.sleep(RECONNECTION_TIME * 1000);
				} catch (InterruptedException e1) {
					e1.printStackTrace();
				}
				
//				LogUnits.errorLog("获取connection失败！！");
				e.printStackTrace();
			}
		}
	
		
		return connection;
	}
}
